package cl.agrosuper.dao
{
	import cl.agrosuper.to.Auditoria;
	import cl.agrosuper.to.GrupoItemAuditoria;
	import cl.agrosuper.to.ItemAuditoria;
	import cl.agrosuper.to.Plantilla;
	import cl.agrosuper.to.Sucursal;
	
	import flash.data.SQLConnection;
	import flash.data.SQLResult;
	import flash.data.SQLStatement;
	import flash.data.SQLTransactionLockType;
	import flash.errors.SQLError;
	import flash.events.SQLEvent;
	
	import mx.collections.ArrayCollection;

	public class AuditoriaDB
	{
		private var conn:SQLConnection;
		private var statement:SQLStatement;
		private var _callback:Function;
		private var itemAuditoriaDB:ItemAuditoriaDB;
		
		public function AuditoriaDB(conn:SQLConnection)
		{
			this.conn = conn;
			statement = new SQLStatement();
			statement.sqlConnection = conn;
		}
		
		public function set callback(value:Function):void
		{
			_callback = value;
		}
		//-------------------------------------------------
		
		public function guardarAuditoria(auditoria:Auditoria, idPlantilla:int):int{
			conn.begin(SQLTransactionLockType.EXCLUSIVE);
			
			try{
				statement.text = "INSERT INTO auditoria(id_plantilla, id_sucursal, fecha, porcentaje, resultado) " +
								 "VALUES(@idPlantilla, @idSucursal, @fecha, @porcentaje, @resultado)";
				statement.parameters["@idPlantilla"] = idPlantilla;
				statement.parameters["@idSucursal"] = auditoria.sucursal.id;
				statement.parameters["@fecha"] = new Date();
				statement.parameters["@porcentaje"] = auditoria.porcentaje;
				statement.parameters["@resultado"] = auditoria.resultado;
				
				statement.execute();
				statement.clearParameters();
				
				statement.text = "SELECT last_insert_rowid() as ID";
				statement.execute();
				var idAuditoria:int = statement.getResult().data[0].ID;
				
				if(itemAuditoriaDB == null)
					itemAuditoriaDB = new ItemAuditoriaDB(conn);
				
				var exito:Boolean = false;
				for each(var grupoItem:GrupoItemAuditoria in auditoria.gruposItem){
					for each(var item:ItemAuditoria in grupoItem.items){
						exito = itemAuditoriaDB.guardarItemAuditoria(idAuditoria, item);
						if(!exito){
							conn.rollback();
							return -1;
						}
					}
				}
				
				conn.commit();
				return idAuditoria;
			}
			catch(e:Error){
				conn.rollback();
			}
			catch(se:SQLError){
				conn.rollback();
			}
			
			return -1;
		}
		
		public function editarAuditoria(auditoria:Auditoria):Boolean{
			conn.begin(SQLTransactionLockType.EXCLUSIVE);
			
			try{
				statement.text = "UPDATE auditoria SET porcentaje = @porcentaje, resultado = @resultado WHERE id = @idAuditoria";
				statement.parameters["@idAuditoria"] = auditoria.id;
				statement.parameters["@porcentaje"] = auditoria.porcentaje;
				statement.parameters["@resultado"] = auditoria.resultado;
				
				statement.execute();
				statement.clearParameters();
				
				if(itemAuditoriaDB == null)
					itemAuditoriaDB = new ItemAuditoriaDB(conn);
				
				var exito:Boolean = false;
				
				exito = itemAuditoriaDB.eliminarItemsAuditoria(auditoria.id);
				if(!exito){
					conn.rollback();
					return false;
				}
				
				for each(var grupoItem:GrupoItemAuditoria in auditoria.gruposItem){
					for each(var item:ItemAuditoria in grupoItem.items){
						exito = itemAuditoriaDB.guardarItemAuditoria(auditoria.id, item);
						if(!exito){
							conn.rollback();
							return false;
						}
					}
				}
				
				conn.commit();
				return true;
			}
			catch(e:Error){
				conn.rollback();
			}
			catch(se:SQLError){
				conn.rollback();
			}
			
			return false;
		}
		
		public function obtenerAuditoriasBasicas():ArrayCollection{
			var auditorias:ArrayCollection = new ArrayCollection();
			
			statement.text = "SELECT a.id id, a.fecha fecha, a.porcentaje porcentaje, a.resultado resultado, a.id_plantilla idPlantilla, s.id idSucursal, s.nombre nombreSucursal " +
							 "FROM auditoria a " +
							 "LEFT OUTER JOIN sucursal s ON s.id = a.id_sucursal ";
			statement.execute();
			
			var result:SQLResult = statement.getResult();
			
			if(result){
				var auditoriasResult:ArrayCollection = new ArrayCollection(result.data);
				
				for each(var resultado:Object in auditoriasResult){
					var auditoria:Auditoria = new Auditoria();
					var sucursal:Sucursal = new Sucursal();
					
					auditoria.id = resultado.id;
					auditoria.fecha = resultado.fecha;
					auditoria.porcentaje = resultado.porcentaje;
					auditoria.resultado = resultado.resultado;
					auditoria.idPlantilla = resultado.idPlantilla;
					
					sucursal.id = resultado.idSucursal;
					sucursal.nombre = resultado.nombreSucursal;
					auditoria.sucursal = sucursal;
					
					auditorias.addItem(auditoria);
				}
			}
			
			return auditorias;
		}
	}
}